#include "qthelper.h"
// 定义静态成员变量
bool QtHelper::useRatio = false;
QtHelper::QtHelper() {}

void QtHelper::setStyle()
{
    //打印下所有内置风格的名字
    //qDebug() << TIMEMS << "QStyleFactory::keys" << QStyleFactory::keys();

    //设置内置风格
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
    qApp->setStyle("Fusion");
#else
    qApp->setStyle("Cleanlooks");
#endif
    //#include "head.h"
    //设置指定颜色
    QPalette palette;
    palette.setBrush(QPalette::Window, QColor("#F0F0F0"));
    //qApp->setPalette(palette);
}
//获取样式
QString QtHelper::getStyle(const QString &qssFile)
{
    QString qss;
    QFile file(qssFile);
    if (file.open(QFile::ReadOnly)) {
#if 0
        qss = QLatin1String(file.readAll());
#else \
        //用下面这种方式读取可以不用区分文件编码
        QStringList list;
        QTextStream stream(&file);
        while (!stream.atEnd()) {
            QString line;
            stream >> line;
            list << line;
        }
        qss = list.join("\n");
#endif
    }

    return qss.trimmed();
}
//设置样式
void QtHelper::setStyle(const QString &qssFile)
{
    QString qss = QtHelper::getStyle(qssFile);
    if (!qss.isEmpty()) {
        QString paletteColor = qss.mid(20, 7);
        qApp->setPalette(QPalette(QColor(paletteColor)));
        qApp->setStyleSheet(qss);
    }
}

/**
     * 初始化所有设置
     *
     */
void QtHelper::initAll(bool utf8, bool style, bool tabCenter, int fontSize)
{
    //         //初始化安卓权限
    //         QtHelper::initAndroidPermission();
    //         //初始化随机数种子
    //         QtHelper::initRand();
    //         //设置编码
    //         QtHelper::setCode(utf8);
    //         //设置字体
    //         QtHelper::setFont(fontSize);

    //         //设置样式风格
    //         if (style) {
    //             QtHelper::setStyle();
    //         }

    //         //选项卡居中
    //         if (tabCenter) {
    //             qApp->setStyleSheet("QTabWidget::tab-bar{alignment:center;}");
    //         }

    //         //设置翻译文件支持多个
    //         QtHelper::setTranslator(":/qm/widgets.qm");
    //         QtHelper::setTranslator(":/qm/qt_zh_CN.qm");
    //         QtHelper::setTranslator(":/qm/designer_zh_CN.qm");

    //         //设置不使用本地系统环境代理配置
    //         QNetworkProxyFactory::setUseSystemConfiguration(false);
    //         //设置当前目录为程序可执行文件所在目录
    //         QDir::setCurrent(QtHelper::appPath());
    //         //Qt4中默认没有程序名称需要主动设置
    // #if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
    //         qApp->setApplicationName(QtHelper::appName());
    // #endif
}

//初始化main
void QtHelper::initMain(bool desktopSettingsAware, bool use96Dpi, bool logCritical )
{
//QT自带宏检查操作系统
#ifdef Q_OS_LINUX
#ifndef Q_OS_ANDROID
    //Qt6开始默认用wayland/由于没有坐标系统导致无边框窗体不可用
    //qputenv("QT_QPA_PLATFORM", "xcb");
#endif
#endif

#ifdef webengine
    //谷歌浏览器禁用沙箱和安全策略以便跨域请求/否则可能报错 Access-Control-Allow-Origin
    qputenv("QTWEBENGINE_DISABLE_SANDBOX", "1");
    qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-web-security");
#endif

#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
    //设置是否应用操作系统设置比如字体
    QApplication::setDesktopSettingsAware(desktopSettingsAware);
#endif

//安卓必须启用高分屏
#ifdef Q_OS_ANDROID
    use96Dpi = false;
#endif

    QtHelper::useRatio = use96Dpi;
#if (QT_VERSION >= QT_VERSION_CHECK(5,6,0) && QT_VERSION < QT_VERSION_CHECK(6,0,0))
        //开启高分屏缩放支持
    if (!use96Dpi) {
        QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
        QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
    }
#endif

#ifdef Q_OS_WIN
    if (use96Dpi) {
        //Qt6中AA_Use96Dpi没效果必须下面方式设置强制指定缩放DPI
        qputenv("QT_FONT_DPI", "96");
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
            //不应用任何缩放
        QApplication::setAttribute(Qt::AA_Use96Dpi);
#endif
    }
#endif

#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0))
    //高分屏缩放策略
    QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
#endif

#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
    //下面这行表示不打印Qt内部类的警告提示信息
    if (!logCritical) {
        QLoggingCategory::setFilterRules("*.critical=false\n*.warning=false");
    }
#endif

#if (QT_VERSION >= QT_VERSION_CHECK(5,4,0))
    //设置opengl共享上下文
    QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
#endif

#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
#ifdef webengine
        //修复openglwidget和webengine共存出现黑屏的bug
    QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL);
#endif
#endif
}
/**
     * 设置应用字体
     * Windows默认字体是"微软雅黑"
     * Linux默认字体是"Ubuntu"
     * MacOS默认字体是"San Francisco"
     */
void QtHelper::setFont(int fontSize)
{
    //安卓套件在有些手机上默认字体不好看需要主动设置字体
    //网页套件需要主动加载中文字体才能正常显示中文
#if (defined Q_OS_ANDROID) || (defined Q_OS_WASM)
    QString fontFile = ":/font/DroidSansFallback.ttf";
    QString fontName = "Droid Sans Fallback";
    qApp->setFont(addFont(fontFile, fontName));
    return;
#endif

#ifdef __arm__
    fontSize = 25;
#endif

    QFont font;
    font.setFamily("MicroSoft Yahei");
    font.setPixelSize(fontSize);
    qApp->setFont(font);
}
/***
 * 设置字体
 */
void QtHelper::setCode(bool utf8)
{
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
    // Qt5 及以下使用原来的方式
    QTextCodec *codec = QTextCodec::codecForName("utf-8");
    if (codec) {
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
        QTextCodec::setCodecForCStrings(codec);
        QTextCodec::setCodecForTr(codec);
#endif
        if (utf8) {
            QTextCodec::setCodecForLocale(codec);
        }
    }
#else \
    // ✅ Qt6：默认就是 UTF-8，不再需要设置编码 \
    // 如果需要控制台中文正常显示，可以手动设置 std::cout 方式
    if (utf8) {
        QTextStream out(stdout);
        out.setEncoding(QStringConverter::Utf8);
        // 或者对全局输出进行设置：
        // QTextStream::setAutoDetectUnicode(true);
    }
#endif
}
// 旧版
//     static void setCode(bool utf8)
//     {
//         QTextCodec *codec = QTextCodec::codecForName("utf-8");
// #if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
//         QTextCodec::setCodecForCStrings(codec);
//         QTextCodec::setCodecForTr(codec);
// #endif
//         //如果想要控制台打印信息中文正常就注释掉这个设置/setCodecForLocale会影响toLocal8Bit函数
//         if (utf8) {
//             QTextCodec::setCodecForLocale(codec);
//         }
//     }
